第一套上机试题
一、改错题
【分析】:改错题的错误一般可分为两类,一类是语法错误,这类错误可通过调试程序改正,较容易;另一类是逻辑错误,这类错误程序能运行,但结果不正确,这类错误相对较难,修改前必须要看懂和理解程序。
#include"stdio.h"
#define n 4 #define m 3 /*语法错,#define m 3需另起一行*/
int a[n][m],s[m];
p(int j)/*此函数的功能为:找出a数组中第j列的最小元素的值及行号,函数成功运行后,i中即为j列的最小元素的行号,s[j]中即为j列的最小元素的值*/
{int k,i,x;
x=a[0][j];i=0; /*逻辑错,从函数的功能可知,a[0][j]也应赋值给s[j],所以x=a[0][j]应改为s[j]=x=a[0][j]*/
for(k=1;k
if(a[k][j]
{i=k;s[j]=x=a[k][j];}
return i;
}
main()
{int index[m],i,j,k;
for(i=0;i
for(j=0;j
scanf("%d",a[i][j]);/*语法错,但编译时不会报错,scanf语句的一般形式为scanf(格式控制,地址表列),所以a[i][j]应改为&a[i][j])*/
for(j=0,j
{index[j]=p[j];
printf("a[%d,%d]=%d\n",index[j],j,s[j]);
}
i=s[1];k=0; /*逻辑错,数组s中存放的是a数组中每一列的最小值,比较时应从数组的第0个元素开始,而下面的for循环是从第1个元素开始的,所以i=s[1]应改为i=s[0]*/
for(j=1;j
if(s[j]
{i=s[j];k=j;}
printf("min=a[%d,%d]=%d",index[k],k,i); }
二、编程题
【分析】:本题的主要功能是建立一个3行8列的二维数组,并给其元素赋值,其中第1、2行的值可通过递推公式xi+1=(25*xi+357)%1024得到,第三行的值取前两行同列元素的最大公约数,所以编程时可用一个函数来实现求公约数的算法。
#include
#include
#define n 8
/*函数gcd实现求最大公约数的算法*/
gcd(int a,int b)
{int c;
while(b!=0)
{c=a%b;a=b;b=c;}
return a;
}
main()
{int i,j,x,a[3][n];
FILE *f;
if((f=fopen("d:\\temp\\1\\myf2.out","w"))= =NULL)
{printf("Create File myf2.out Failed!\n");exit(0);}
x=26;
/*下面二重for循环实现给第1、2行数组元素赋值的功能*/
for(i=0;i<2;i++)
for(j=0;j
{a[i][j]=x;x=(25*x+357)%1024;}
/*下面for循环通过调用gcd函数实现给第3行数组元素赋值的功能*/
for(j=0;j
a[2][j]=gcd(a[0][j],a[1][j]);
/*下面for循环实现按题目所给格式输出二维数组的功能*/
for(i=0;i<3;i++)
{for(j=0;j
fprintf(f,"\n");
}
fclose(f); }